#!/usr/bin/python3
# -*- coding: UTF-8 -*-

# 如果一个函数在内部调用自身本身，这个函数就是递归函数
# 定义简单，逻辑清晰
# 计算阶乘n! = 1 x 2 x 3 x ... x n
def fact(n):
    if n == 1:
        return 1
    return n * fact((n -1))

print(fact(8))

# 使用递归函数需要注意防止栈溢出
# fact(1000)
# 解决递归调用栈溢出的方法是通过尾递归优化
def fact(n,):
    return fact_iter(n, 1)
def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)

fact(5)

# 递归与尾递归总结
# http://www.cnblogs.com/Anker/archive/2013/03/04/2943498.html